﻿using System;
using System.Windows;
using System.Windows.Controls;
using System.Security.Cryptography;
using System.Text;
using Entidades;
using Excepciones;
using Negocio;
using DAO;
using System.Collections.Generic;
using LisBioGUIWPF.util;

namespace LisBioGUIWPF.Controls.Encargado
{
    [LisBioException]
    public partial class EncargadoData : UserControl
    {
        LisBio lisBio;

        public enum Operacion
        { 
            NUEVO, ELIMINAR, MODIFICAR
        }

        private Operacion operacion;
        private ReglaBase.Operacion operRegla;
        private EntidadInvestigador usuario;
        private EncargadoControl encargadoControl;

        List<EntidadBase> barrios = new List<EntidadBase>();

        public EncargadoData(LisBio lisBio, Operacion operacion, EncargadoControl encargadoControl)
        {
            InitializeComponent();
            this.lisBio = lisBio;
            this.operacion = operacion;
            this.encargadoControl = encargadoControl;

            this.Loaded += new RoutedEventHandler(EncargadoData_Loaded);
            
            switch (operacion)
            {
                case Operacion.NUEVO:
                    this.tabDatos.Header = "Nuevo Encargado";
                    this.operRegla = ReglaBase.Operacion.INSERT; break;
                case Operacion.MODIFICAR:
                    this.tabDatos.Header = "Modificar Encargado";
                    this.operRegla = ReglaBase.Operacion.UPDATE;
                    if (!this.lisBio.GodMode)
                    {
                        this.bloquear();
                    }
                    this.txtPassword.IsEnabled = true; break;
                case Operacion.ELIMINAR:
                    this.tabDatos.Header = "Eliminar Encargado";
                    this.btnGuardar.Content = "Eliminar";
                    this.bloquear();
                    this.operRegla = ReglaBase.Operacion.DELETE; break;
            }
            this.listarBarrios();
        }

        void EncargadoData_Loaded(object sender, RoutedEventArgs e)
        {
            this.txtNombre.Focus();
        }

        private void btnCancel_Click(object sender, RoutedEventArgs e)
        {
            ImageControl image = new ImageControl(this.lisBio);
            image.setDefaultImage();
            if (this.lisBio.borderControles.Child != null)
            {
                this.lisBio.borderControles.Child.IsEnabled = true;
            }
            this.lisBio.borderHuella.Child = image;

            //Listando nuevamente el combo para que se obtengan los encargados con los datos actualizados
            encargadoControl.listarEncargados();
            
        }

        private bool checkData()
        {
            if (txtNombre.Text.Length > 0 && txtDNI.Text.Length > 0 && txtLegajo.Text.Length > 0)
            {
                return true;
            }

            return false;
        }

        private void btnGuardar_Click(object sender, RoutedEventArgs e)
        {
            if (!this.checkData())
            {
                MessageBox.Show("Faltan completar algunos Datos.", "Datos Incorrectos");
            }
            else
            {                
                //DEFINIR COMO SE VA A PASAR LA URL DE LA IMAGEN Y LA HUELLA
                EntidadBarrio barrio = (EntidadBarrio)comboBarrio.SelectedItem;

                byte[] tmpPassword;
                byte[] tmpHash;
                //Crea una matriz de bytes de los datos de origen
                tmpPassword = ASCIIEncoding.ASCII.GetBytes(txtPassword.Password);

                //Calcula hash a partir de los datos de origen
                tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpPassword);

                string password = ASCIIEncoding.ASCII.GetString(tmpHash);
                
                EntidadInvestigador encargado = new EntidadInvestigador(txtNombre.Text, 
                    txtDNI.Text, txtLegajo.Text, txtTelefono.Text, txtCelular.Text, txtWeb.Text, txtMail.Text, txtDireccion.Text,
                    "huella", "", barrio, null, txtUserName.Text, password, true, null, true);

                //Seteando el id del encargado al que se van a actualizar los datos, los demas datos se obtuvieron del formulario
                if (usuario != null)
                {
                    encargado.Id = usuario.Id;
                }
           
                InvestigadorDAO encargadoDAO = new InvestigadorDAO();
                ReglaBase regla = new ReglaBase(encargado, encargadoDAO, this.operRegla);

                try
                {
                    regla.execute();
                    switch (operacion)
                    {
                        case Operacion.NUEVO:
                            this.lisBio.notification("Encargado Guardado");
                            break;
                        case Operacion.MODIFICAR:
                            this.lisBio.notification("Encargado Modificado");
                            break;
                        case Operacion.ELIMINAR:
                            this.lisBio.notification("Encargado Eliminado");
                            break;
                    }

                    this.btnCancel_Click(sender, e);
                }
                catch (InvalidEntityException exc)
                {
                    MessageBox.Show("Los Datos del Encargado no se han podido guardar.\n" +
                    "Puede que los datos no sean correctos.\nPor favor intentelo nuevamente...", "Datos Encargado");
                }
                catch (Exception exception)
                {
                    MessageBox.Show("Se ha producido el siguiente error:\n"+exception.Message, "Error!");

                    MessageBoxResult result = MessageBox.Show("Desea reportar el error?", "Error Desconocido", MessageBoxButton.YesNo);

                    if (result == MessageBoxResult.Yes)
                    {
                        ReportBugs reportar = new ReportBugs();
                        reportar.Show();
                    }
                }                
            }
        }

        private void bloquear()
        {
            this.txtNombre.IsReadOnly = true;
            if (this.operacion != Operacion.MODIFICAR)
            {
                this.txtUserName.IsReadOnly = true;
                this.txtPassword.IsEnabled = true;
                this.txtDNI.IsReadOnly = true;
                this.txtLegajo.IsReadOnly = true;
                this.txtMail.IsReadOnly = true;
                this.txtCelular.IsReadOnly = true;
                this.txtTelefono.IsReadOnly = true;
                this.txtWeb.IsReadOnly = true;
                this.txtDireccion.IsReadOnly = true;
                this.comboBarrio.IsReadOnly = true;
            }
        }

        private void listarBarrios()
        {
            BarrioDAO daoBarrio = new BarrioDAO();
            barrios = daoBarrio.leerTodas();

            for (int i = 0; i < barrios.Count; i++)
            {
                comboBarrio.Items.Add((EntidadBarrio)barrios[i]);
            }
            comboBarrio.DisplayMemberPath = "Nombre";
            comboBarrio.SelectedValuePath = "Id";
        }

        public void cargarDatos()
        {
            //Tab Investigador
            this.txtCelular.Text = this.usuario.TelefonoCelular;
            this.txtDireccion.Text = this.usuario.Direccion;
            this.txtDNI.Text = this.usuario.Dni;
            this.txtLegajo.Text = this.usuario.Legajo;
            this.txtMail.Text = this.usuario.Mail;
            this.txtNombre.Text = this.usuario.NombreYApellido;
            this.txtTelefono.Text = this.usuario.TelefonoFijo;
            this.txtCelular.Text = this.usuario.TelefonoCelular;
            this.txtWeb.Text = this.usuario.SitioWeb;
            this.txtUserName.Text = this.usuario.UserName;
            this.txtPassword.Password = "";
            this.comboBarrio.SelectedValue = this.usuario.Barrio.Id;
        }

        public EntidadInvestigador Usuario
        {
            get { return this.usuario; }
            set { this.usuario = value; }
        }

        private void comboBarrio_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if (e.Key != System.Windows.Input.Key.Escape &&
                e.Key != System.Windows.Input.Key.Down &&
                e.Key != System.Windows.Input.Key.Up &&
                e.Key != System.Windows.Input.Key.Left &&
                e.Key != System.Windows.Input.Key.Right &&
                e.Key != System.Windows.Input.Key.Enter)
            {

                this.comboBarrio.IsDropDownOpen = true;
            }
        }
    }    
}
